%     FASTENER DOCTOR - программа для лечения и конвертации крепежа
%     Copyright (C) 2018-2019  Михаил Козлов
%     Сайт проекта: <http://www.fastenerdoctor.ru/>
%     Адрес электронной почты для связи с разработчиком:
%     <doctor.fastener@gmail.com>
% 
%     Эта программа является свободным программным обеспечением: Вы можете
%     распространять ее и/или изменять, соблюдая условия Универсальной общественной
%     лицензии GNU, опубликованной Фондом свободного программного обеспечения,
%     либо редакции 3, либо (на Ваше усмотрение) любой редакции, выпущенной позже.
% 
%     Эта программа распространяется в надежде на то, что она окажется полезной,
%     но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, включая даже подразумеваемую гарантию ТОВАРНОЙ ПРИГОДНОСТИ,
%     либо ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Ознакомьтесь с Универсальной общественной
%     лицензией GNU для получения более подробной информации.
% 
%     Вы должны были получить копию Универсальной общественной лицензии GNU
%     вместе с этой программой. Если Вы ее не получили, то перейдите по адресу:
%     <http://www.gnu.org/licenses/>.
% 
%     This program is free software: you can redistribute it and/or modify
%     it under the terms of the GNU General Public License as published by
%     the Free Software Foundation, either version 3 of the License, or
%     (at your option) any later version.
% 
%     This program is distributed in the hope that it will be useful,
%     but WITHOUT ANY WARRANTY; without even the implied warranty of
%     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
%     GNU General Public License for more details.
% 
%     You should have received a copy of the GNU General Public License
%     along with this program.  If not, see <https://www.gnu.org/licenses/>.

function [Read_Result, Result_type] = Explore_Next_Field (Previous_index, Record_length, End_card_flag, string)

% Функция предварительного просмотра опционального поля (CHAR, REAL, INTEGER or blank) без изменения указателей чтения
       
Read_Result = [];
Result_type = []; % (CHAR | REAL | INTEGER)

% Чтение поля
if (End_card_flag ~= 1)

    % Расчет теоретических индексов
    Start_index = Previous_index + 1;
    End_index = Previous_index + Record_length;
    
    % Чтение CHAR, REAL, INTEGER or blank, поле опциональное
    if (length(Trim_CR_LF(string)) > Previous_index)
        
        if (length(string) < End_index)
            End_index = length(string);
        end
        
        % Проверка формата результата и его считывание
        if (~isempty(strfind(string(Start_index:End_index), '.'))) %#ok<STREMP> % Для совместимости с GNU Octave вместо if (contains(string(Start_index:End_index), '.'))
            tmp_number = str2double(string(Start_index:End_index));
            if (isnan(tmp_number))
                tmp_number_2 = sscanf(string(Start_index:End_index), '%e%d');
                if (size(tmp_number_2,1) == 2)
                    Read_Result = tmp_number_2(1)*10^tmp_number_2(2);
                    Result_type = 'REAL';
                else
                    Read_Result = strtrim(string(Start_index:End_index));
                    Result_type = 'CHAR';
                end
            else
                Read_Result = tmp_number;
                Result_type = 'REAL';
            end
        else
            if (~isnan(str2double(string(Start_index:End_index))))
                Read_Result = str2double(string(Start_index:End_index));
                Result_type = 'INTEGER';
            else
                if (~isempty(strtrim(string(Start_index:End_index))))
                    Read_Result = strtrim(string(Start_index:End_index));
                    Result_type = 'CHAR';
                end
            end
        end
        
    end
    
end
